
#pragma once

#if defined(__GNUC__) || defined(__MINGW32__) || defined(__MINGW__)
    #pragma GCC diagnostic push
    #pragma GCC diagnostic ignored "-Weffc++"
    #pragma GCC diagnostic ignored "-Wnon-virtual-dtor"
#endif


//#include <boost/serialization/access.hpp>
//#include <boost/serialization/assume_abstract.hpp>
//#include <boost/serialization/split_member.hpp>

namespace tools{

    class Variant;

    namespace variant_detail{

        typedef Wrapper<IStep, eSIZE_BUFF_ITERATORS> Native;

        struct IHelper: VariantTypes
        {
            bool Compare(const void* me, const void* other, const eTYPE type_other)const
            {
                if( !IsTypeSame(type_other) )
                    return false;

                return IsValueSame(me, other);
            }


            virtual bool IsValueSame(const void* my, const void* other)const=0;
            virtual bool IsTypeSame(const eTYPE& type)const=0;
            virtual bool IsPrimitive()const=0;

            virtual size_t GetSize()const=0;

            virtual bool IsFloating()const=0;
            virtual bool IsInteger()const=0;

            virtual const ::std::type_info& GetTypeInfo()const=0;
            virtual const char* GetTypeName()const=0;
            virtual eTYPE GetType()const=0;
            virtual eCATEGORY GetCategory()const=0;

            virtual const Str ToString(const void* const data  )const=0;
            virtual size_t Elements(const void* const data)const = 0;

            virtual Native GetIterator(Variant& variant,const bool beg)const=0;
            
            virtual Native GetConstIterator(const Variant& variant,const bool beg)const=0;
            virtual Native GetConstIterator(Variant& variant,const bool beg)const=0;

            virtual Native GetReverseIterator(Variant& variant,const bool beg)const=0;

            virtual Native GetConstReverseIterator(const Variant& variant,const bool beg)const=0;
            virtual Native GetConstReverseIterator(Variant& variant,const bool beg)const=0;


            virtual Native GetPrimitiveIterator(Variant& variant,const bool beg)const=0;
            virtual Native GetPrimitiveConstIterator(const Variant& variant,const bool beg)const=0;
            virtual Native GetPrimitiveConstIterator(Variant& variant,const bool beg)const=0;
            virtual Native GetPrimitiveReverseIterator(Variant& variant,const bool beg)const=0;
            virtual Native GetPrimitiveConstReverseIterator(const Variant& variant,const bool beg)const=0;
            virtual Native GetPrimitiveConstReverseIterator(Variant& variant,const bool beg)const=0;

//        private:
//            friend class boost::serialization::access;

//            template<class Archive>
//            void serialize(Archive & ar, const unsigned int )
//            {
//                (void)ar;
//                //ar & BOOST_SERIALIZATION_NVP(mSome);
//            }

        };

//        BOOST_SERIALIZATION_ASSUME_ABSTRACT(IHelper);

    }//namespace variant_detail
}//namespace tools


#if defined(__GNUC__) || defined(__MINGW32__) || defined(__MINGW__)
    #pragma GCC diagnostic pop
#endif
